﻿// 我的数组的栈.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace   std;
template <typename T>
class ArrayStack {

private: 
	T* data;
	T capacity;   // 栈的容量
	T topIndex;   // 栈顶指针(索引)

	public: ArrayStack(int value =10) :capacity(value), topIndex(-1)
	{
		 data = new T[capacity];
	}		
	~ArrayStack() {
		delete[] data;
	}
	void push(int value) {

		//if (topIndex >= capacity - 1) {//注释~ArrayStack。切注释这里，不检查也正常，但是可能会覆盖其他地址的值，导致位置错误
		//	cout << "Stack is full! Cannot push " << value << endl;
		//	return;
		//}
		if (topIndex == capacity - 1) {
		
			resize(capacity*2); // 如果栈满，扩容
		}
		
		data[++topIndex] = value;
	}

	T pop() {
		if (isEmpty()) {
			throw std::out_of_range("Stack is empty");
		}
		// 如果元素数量小于容量的1/4，缩小数组
		if (topIndex < capacity / 4 && capacity > 10) {
			resize(capacity / 2);
		}

		return data[topIndex--];
	
	}

	bool isEmpty() {
		return topIndex == -1;
	}
private:
	// 调整数组大小
	void resize(int newCapacity) {
		T* newData = new T[newCapacity];
		for (int i = 0; i <= topIndex; ++i) {
			if (i >= newCapacity)
				return;

			newData[i] = data[i];
		}
		delete[] data;
		data = newData;
		capacity = newCapacity;
	}
};


void main() {
	ArrayStack<int> array;
	array.push(1);
	array.push(2);
	array.push(3);
	while (!array.isEmpty()) {
		cout << "值为" << array.pop() << endl;
	
	}
}